/*************************************************************************
                         flow  -  description
                             -------------------
    debut                : 10 oct. 2009
    copyright            : (C) 2009 par Binome 3310
*************************************************************************/

//---------- Description de la classe <flow> (fichier flow.h) -----------

//--------------------------------------------------------------- INCLUDE

//-------------------------------------------------------- Include systeme
#include <iostream>

//------------------------------------------------------ Include personnel
#include "flow.h"

//------------------------------------------------------------- Constantes
//----------------------------------------------------------------- PUBLIC

//----------------------------------------------------- Methodes publiques
// type Collection::Méthode (liste des paramètres)
// Algorithme
//
//{
//} //------ Fin de Méthode

	void flow::CurrentLine()
	// Algorithme :
	//
	//Extrait une ligne du flux et la place dans currentLine
	{
		++currentLineNumber;

		if (! stream.eof())
		{
			EOS = stream.eof();
			getline(stream, currentLine);
			length = currentLine.length();
			currentPosition = 0;
			if (length == 0)
			{
				CurrentLine();
			}
		}
		else EOS = true;
	} //------ Fin de Méthode

	codeRetourFlow flow::CurrentWord(string &word)
	// Algorithme :
	//
	//Récupère le mot courant dans la ligne currentLine
	{
		correction = 0;

		if (EOS)
		{
			return EOSTREAM;
		}

		int tempPosition = currentLine.find_first_of(delimiters, currentPosition);

		while(currentPosition == tempPosition || (currentLine[currentPosition] >= '0' && currentLine[currentPosition] <= '9'))
		{
			if (currentPosition == length - 1)
			{
				if (stream.eof())
				{
					return EOSTREAM;
				}

				CurrentLine();
				tempPosition = 0;
			}
			else
			{
				++currentPosition;

				while(currentLine[currentPosition] >= '0' && currentLine[currentPosition] <='9')
				{
					if (currentPosition == length - 1)
					{
						if (stream.eof())
						{
							return EOSTREAM;
						}

						CurrentLine();
						tempPosition = 0;
					}
					else
					{
						++currentPosition;
					}
				}
			}

			tempPosition = currentLine.find_first_of(delimiters, currentPosition);
		}

		if (tempPosition == -1)
		{
			word = currentLine.substr(currentPosition, length - currentPosition);
			correction = 1;
			CurrentLine();
			if (word.length() == 0)
			{
				return EMPTY_LINE;
			}
			return FLOWOK;
		}

		word = currentLine.substr(currentPosition, tempPosition - currentPosition);
		currentPosition = tempPosition;
		if (word.length() == 0)
		{
			return EMPTY_LINE;
		}
		return FLOWOK;
	} //------ Fin de Méthode

	int flow::GetLine()
	// Algorithme :
	//
	{
		return currentLineNumber - correction;
	} //------ Fin de Méthode

//-------------------------------------------------- Surcharge d'opérateur

//-------------------------------------------- Constructeurs - destructeur

	flow::flow(char* path, string delimit)
	// Algorithme :
	//
	//Attention ne pas oublier de vérifier que l'ouverture s'est bien faite
	//code derreur sinon;
	{
		#ifdef MAP
			cout << "Appel au constructeur de <flow>" << endl;
		#endif

		stream.open(path);
		currentLineNumber = 0;
		currentPosition = 0;
		correction = 1;
		delimiters = delimit;
		EOS = false;
		CurrentLine();
	} //------ Fin de flow

	flow::~flow()
	{
		#ifdef MAP
			cout << "Appel au destructeur de <flow>" << endl;
		#endif
	} //------ Fin de ~flow

//------------------------------------------------------------------ PRIVE

//----------------------------------------------------- Méthodes protégées
